package _4lists.src.queue;


import java.util.Objects;
import java.util.Queue;

/**
 * @className: queue2
 * @description:
 * @author: myself
 * @date: 2025/7/23 17:45
 * @version: 0.1
 * @since: JDK17
 */

public class ArrayQueue<E>{
    private  Object[] array ;//代表实现对列的数组
    private  int head = 0;//代表头指针，也是索引
    private  int tail = 0;//代表尾指针，也是索引
    @SuppressWarnings("all")//可以控制不发生警告//由于这里不能正常的
	public ArrayQueue(int capacity){
        array = (E[])new Object[capacity + 1];
    }

    //向队列尾部进行数据的添加
    public  boolean offer(Object value) {
        if (isFull()) {//判断是否已满
            return false;
        }
        array[tail] = value;//FIFO，向尾部添加数据
        tail = (tail + 1) % array.length;//更新尾指针的索引
        return true;
    }

    //查找但不移除元素
    public  Object peek() {
        if (isEmpty()) {//判断是否为空
            return null;
        }
        Object val = array[head];//FIFO,输出头指针数据
        return (E)val;
    }

    //查找并且移除元素
    public  Object poll() {
        if (isEmpty()) {//判断是否为空
            return null;
        }
        Object val =(E) array[head];//FIFO,输出头指针数据
        head = (head + 1) % array.length;//更新头指针的索引
        return val;
    }

    //实现判断是否已满(尾指针前进一次是否等于头指针)
    public  boolean isFull() {
        return (tail + 1) % array.length == head;
    }

    //判断队列是否为空（当头指针等于尾指针时）
    public  boolean isEmpty() {
        return head == tail;
    }

    //进行数据的遍历
    public  void foreach() {
        if (isFull()) {
            return;
        }
        int p = head;//找一个指针指向数组，为了后续不改变head的位置
        while (p != tail) {
            System.out.println(array[p]);
            p = (p + 1) % array.length;
        }
    }
}